/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * Relatorio.java
 *
 * Created on 08/05/2011, 23:10:13
 */

package com.puc.GUI;

import com.puc.executor.EscalonadorRoundRobin;
import com.puc.executor.EscalonadorSJF;
import com.puc.vo.Processo;
import com.puc.vo.ProcessoRR;
import java.util.PriorityQueue;
import javax.swing.DefaultListModel;

/**
 *
 * @author FerstL
 */
public class Relatorio extends javax.swing.JFrame {

    /** Creates new form Relatorio */
    public Relatorio() {
        
        initComponents();
         if (Simulador2.SJF.isSelected() == true && Simulador2.round.isSelected() == false)
            exibeRelatorioProcessosExecutatos();
         else
            exibeRelatorioProcessosExecutatosRound();

    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jScrollPane1 = new javax.swing.JScrollPane();
        relatorio = new javax.swing.JTextArea();
        jButton1 = new javax.swing.JButton();
        jLabel1 = new javax.swing.JLabel();

        relatorio.setColumns(20);
        relatorio.setRows(5);
        jScrollPane1.setViewportView(relatorio);

        jButton1.setText("Fechar");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });

        jLabel1.setFont(new java.awt.Font("Arial", 1, 14));
        jLabel1.setText("Relatorio de Execução");

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addGap(280, 280, 280)
                        .addComponent(jButton1))
                    .addGroup(layout.createSequentialGroup()
                        .addGap(19, 19, 19)
                        .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 628, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(layout.createSequentialGroup()
                        .addGap(241, 241, 241)
                        .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 173, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap(33, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addContainerGap(21, Short.MAX_VALUE)
                .addComponent(jLabel1)
                .addGap(18, 18, 18)
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 214, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(18, 18, 18)
                .addComponent(jButton1)
                .addGap(31, 31, 31))
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed

        this.setVisible(false);
    }//GEN-LAST:event_jButton1ActionPerformed

    /**
    * @param args the command line arguments
    */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new Relatorio().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton jButton1;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTextArea relatorio;
    // End of variables declaration//GEN-END:variables

private void exibeRelatorioProcessosExecutatos(){

        Object[] listaProntos = EscalonadorSJF.listaProcessosExecutados.toArray();
        System.out.println("############### Relatorio ##################");

        double calculoPercentualCPUOciosa = (EscalonadorSJF.getTempoCPUOciosa()/EscalonadorSJF.getCountInterecao())*100;
        double calculoPercentualCPUOcupada = ((EscalonadorSJF.getTempoCPUOcupada()/EscalonadorSJF.getCountInterecao())*100);

        relatorio.append("CPU Ocupada :" +  formatarNumeroSemcasa(EscalonadorSJF.getTempoCPUOcupada())+"\n");
        relatorio.append("(%) :" + formatarNumero(calculoPercentualCPUOcupada)  +"\n");
        relatorio.append("CPU Ociosa :" +  formatarNumeroSemcasa(EscalonadorSJF.getTempoCPUOciosa())+"\n");
        relatorio.append("(%) :" + formatarNumero(calculoPercentualCPUOciosa)  +"\n");

        for(int i = 0; i<listaProntos.length; i++){

           relatorio.append("Processo : " + ((Processo)listaProntos[i]).getId()+"\n");
           int turnaround = ((Processo)listaProntos[i]).getWatingTime() + ((Processo)listaProntos[i]).getBlockedTime() + ((Processo)listaProntos[i]).getTurnAroundTime();
           relatorio.append("Turnaround Time: " + turnaround+ "\n");
           relatorio.append("Waiting Time: " + ((Processo)listaProntos[i]).getWatingTime()+"\n");
           relatorio.append("Blocked Time: " + ((Processo)listaProntos[i]).getBlockedTime()+"\n");
        }
        relatorio.append("\n"+"#### Dispositivos \n");

        for(int i = 0; i<EscalonadorSJF.listaDispositivo.size(); i++){

           double calculoPercentualDispositivoOcioso =((EscalonadorSJF.listaDispositivo.get(i).getTempoOcupado()/EscalonadorSJF.getCountInterecao())*100);
           relatorio.append("Dispositivo : " + EscalonadorSJF.listaDispositivo.get(i).getId()+"\n");
           relatorio.append("Tempo Ocupado: " +  EscalonadorSJF.listaDispositivo.get(i).getTempoOcupado()+"\n");
           relatorio.append("Percentual Ocupado(%): " + formatarNumero(calculoPercentualDispositivoOcioso) +"\n");
        }



}
private void exibeRelatorioProcessosExecutatosRound(){

        Object[] listaProntos = EscalonadorRoundRobin.listaProcessosExecutados.toArray();
        System.out.println("############### Relatorio ##################");

        double calculoPercentualCPUOciosa = (EscalonadorRoundRobin.getTempoCPUOciosa()/EscalonadorRoundRobin.getCountInterecao())*100;
        double calculoPercentualCPUOcupada = ((EscalonadorRoundRobin.getTempoCPUOcupada()/EscalonadorRoundRobin.getCountInterecao())*100);

        relatorio.append("CPU Ocupada :" +  formatarNumeroSemcasa(EscalonadorRoundRobin.getTempoCPUOcupada())+"\n");
        relatorio.append("(%) :" + formatarNumero(calculoPercentualCPUOcupada)  +"\n");
        relatorio.append("CPU Ociosa :" +  formatarNumeroSemcasa(EscalonadorRoundRobin.getTempoCPUOciosa())+"\n");
        relatorio.append("(%) :" + formatarNumero(calculoPercentualCPUOciosa)  +"\n");


        for(int i = 0; i<listaProntos.length; i++){
           relatorio.append("Processo : " + ((ProcessoRR)listaProntos[i]).getId()+"\n");
           int turnaround = ((ProcessoRR)listaProntos[i]).getWatingTime() + ((ProcessoRR)listaProntos[i]).getBlockedTime() + ((ProcessoRR)listaProntos[i]).getTurnAroundTime();
           relatorio.append("Turnaround Time: " + turnaround+ "\n");
           relatorio.append("Waiting Time: " + ((ProcessoRR)listaProntos[i]).getWatingTime()+"\n");
           relatorio.append("Blocked Time: " + ((ProcessoRR)listaProntos[i]).getBlockedTime()+"\n");
        }
        relatorio.append("#### Dispositivos \n");
        for(int i = 0; i<EscalonadorRoundRobin.listaDispositivo.size(); i++){

           double calculoPercentualDispositivoOcioso =((EscalonadorRoundRobin.listaDispositivo.get(i).getTempoOcupado()/EscalonadorRoundRobin.getCountInterecao())*100);
           relatorio.append("Dispositivo: " + EscalonadorRoundRobin.listaDispositivo.get(i).getId()+"\n");
           relatorio.append("Tempo Ocupado: " +  EscalonadorRoundRobin.listaDispositivo.get(i).getTempoOcupado()+"\n");
           relatorio.append("Percentual Ocupado(%): " + formatarNumero(calculoPercentualDispositivoOcioso) +"\n");
        }


}

private String formatarNumero(double numero){

    java.text.NumberFormat nf = java.text.NumberFormat.getNumberInstance();
    nf.setMaximumFractionDigits(2);
    return nf.format(numero);
}
private String formatarNumeroSemcasa(double numero){

    java.text.NumberFormat nf = java.text.NumberFormat.getNumberInstance();
    nf.setMaximumFractionDigits(0);
    return nf.format(numero);
}



}
